﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using Unimaq.FacturaDBS_Spring.Entidades;
using System.Globalization;
using IBM.Data.DB2.iSeries;

namespace Unimaq.FacturaDBS_Spring.LogicaNegocio
{
    public class CabeceraFacturaBLL
    {
        public List<Entidades.FacturaDBS_Cabecera> ReadTextFile(string ruta)
        {
            //DataTable dt;
            string line;
            Entidades.FacturaDBS_Cabecera cabeceraFactura;
            List<Entidades.FacturaDBS_Cabecera> result = new List<FacturaDBS_Cabecera>();

            // Read the file and display it line by line.
            using (StreamReader file = new StreamReader(string.Format("{0}",ruta)))
            {
                while ((line = file.ReadLine()) != null)
                {
                    if (line.StartsWith("0000"))
                    {                        
                        char[] delimiters = new char[] { '\t' };
                        string[] parts = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

                        if (parts.Length == 25)
                        {
                            cabeceraFactura = new FacturaDBS_Cabecera()
                            {
                                IndicadorInicioCabecera = parts[0].Trim(),
                                TipoComprobante = parts[1].Trim(),
                                Seriecomprobante = parts[2].Trim(),
                                NumeroComprobante = parts[3].Trim(),
                                Campo1 = parts[4].Trim(),
                                FechaEmision = parts[5].Trim(),
                                FechaVencimiento = parts[6].Trim(),
                                Campo2 = parts[7].Trim(),
                                Campo3 = parts[8].Trim(),
                                TipoCambio = parts[9].Trim(),
                                MontoBruto = parts[10].Trim(),
                                Descuento = parts[11].Trim(),
                                Impuestos = parts[12].Trim(),
                                MontoTotal = parts[13].Trim(),
                                DocReferencia = parts[14].Trim(),
                                OrdendeCompra = parts[15].Trim(),
                                Moneda = parts[16].Trim(),
                                RazonSocial = parts[17].Trim(),
                                Direccion = parts[18].Trim(),
                                Telefono = parts[19].Trim(),
                                Ruc_razonSocial = parts[20].Trim(),
                                Campo8 = parts[21].Trim(),
                                Estado = parts[22].Trim(),
                                FechaProceso = parts[23].Trim(),
                                IndicadorFinCabecera = parts[24].Trim()
                            };

                            result.Add(cabeceraFactura);
                            //for (int i = 0; i < parts.Length; i++)
                            //{
                            //    Console.WriteLine(parts[i]);
                            //    //sepList.Add(parts[i]);
                            //}
                            //Console.WriteLine("--------------------------------------------------------------"); 
                        }
                    }
                }

                file.Close();

                return result;
            }
            // Suspend the screen.
            //Console.ReadLine();
        }

        public List<Entidades.Spring.FacturaSpring_Cabecera2> ToSpring_Cabecera(List<FacturaDBS_Cabecera> lista)
        {
            //List<FacturaSpring_Cabecera> result = new List<FacturaSpring_Cabecera>();
            //Entidades.FacturaSpring_Cabecera cabeceraFactura;

            //foreach (FacturaDBS_Cabecera dbsFactura in lista)
            //{
            //    cabeceraFactura = new FacturaSpring_Cabecera()
            //    {
            //        TipoComprobante = dbsFactura.TipoComprobante,
            //        SerieComprobante = dbsFactura.Seriecomprobante,
            //        NumeroComprobante = dbsFactura.NumeroComprobante,
            //        DocumentoCliente = dbsFactura.Ruc_razonSocial,
            //        NombreCliente = dbsFactura.RazonSocial,
            //        DireccionCliente = dbsFactura.Direccion,
            //        FechaEmision = dbsFactura.FechaEmision,
            //        FechaVencimiento = dbsFactura.FechaVencimiento,
            //        Moneda = dbsFactura.Moneda,
            //        TipoCambio = dbsFactura.TipoCambio,
            //        MontoAfecto = dbsFactura.MontoBruto,
            //        MontoImpuestoVentas = dbsFactura.Impuestos,
            //        CentroCosto = getCentroCosto(dbsFactura.Seriecomprobante, dbsFactura.DocReferencia),
            //        EstadoDocumento = dbsFactura.Estado
            //    };

            //    result.Add(cabeceraFactura);
            //}

            List<Entidades.Spring.FacturaSpring_Cabecera2> result = new List<Entidades.Spring.FacturaSpring_Cabecera2>();
            Entidades.Spring.FacturaSpring_Cabecera2 cabeceraFactura;

            foreach (FacturaDBS_Cabecera dbsFactura in lista)
            {
                cabeceraFactura = new Entidades.Spring.FacturaSpring_Cabecera2()
                {
                    TipoComprobante = dbsFactura.TipoComprobante,
                    SerieComprobante = dbsFactura.Seriecomprobante,
                    NumeroComprobante = dbsFactura.NumeroComprobante,
                    DocumentoCliente = dbsFactura.Ruc_razonSocial,
                    NombreCliente = dbsFactura.RazonSocial,
                    DireccionCliente = dbsFactura.Direccion,
                    FechaEmision = convertTextToDateTime(dbsFactura.FechaEmision),
                    FechaVencimiento = convertTextToDateTime(dbsFactura.FechaVencimiento),
                    Moneda = dbsFactura.Moneda,
                    TipoCambio = Convert.ToDecimal(dbsFactura.TipoCambio),
                    MontoAfecto = Convert.ToDecimal(dbsFactura.MontoBruto),
                    MontoImpuestoVentas = Convert.ToDecimal(dbsFactura.Impuestos),
                    CentroCosto = getCentroCosto(dbsFactura.Seriecomprobante, dbsFactura.DocReferencia),
                    EstadoDocumento = dbsFactura.Estado
                };

                result.Add(cabeceraFactura);
            }

            return result;
        }

        public List<Entidades.Spring.FacturaSpring_Cabecera2> ToSpring_Cabecera(List<Entidades.DBS_Header_Factura> lista)
        {
            List<Entidades.Spring.FacturaSpring_Cabecera2> result = new List<Entidades.Spring.FacturaSpring_Cabecera2>();

            foreach (Entidades.DBS_Header_Factura l in lista)
            {
                Entidades.Spring.FacturaSpring_Cabecera2 cab =
                    new Entidades.Spring.FacturaSpring_Cabecera2()
                    {
                        TipoComprobante = getTipoComprobante(l.Suntip),
                        SerieComprobante = l.Sunpre.Value.ToString(),
                        NumeroComprobante = l.Sunnum.Value.ToString(),
                        IdClienteFacturacion = l.Codcli.Trim(),
                        DocumentoCliente = l.Numruc.Trim(),
                        NombreCliente = l.Rsocia.Trim(),
                        DireccionCliente = l.Direcc.Trim(),
                        FechaEmision = convertTextToDateTime(l.Fecemi.Trim()),
                        FechaVencimiento = new Nullable<DateTime>(),
                        Moneda = convertMoneda(l.Moneda),
                        TipoCambio = l.Tipcam.Value,
                        MontoAfecto =  l.Suntip.Trim() ==  "NC" ? l.Vavta1.Value : l.Valaf16.Value,
                        MontoNoAfecto = new decimal(0),
                        MontoImpuestoVentas = l.Impor16.Value,
                        CentroCosto = l.Cencos.Trim(),
                        DocumentoRelacionado = !string.IsNullOrWhiteSpace(l.Refnot) ? getDocumentoRelacionado(l.Refnot) : string.Empty,
                        EstadoDocumento = "3",
                        ClasificadorMovimiento = "999",
                        UnidadOrganizacional = "999",
                        ConceptoGasto = "999",
                        UsuarioCreacion = l.Usuinc.Trim(),
                        CodigoInterno = l.Numori.Trim()
                    };

                result.Add(cab);
            }

            return result;
        }

        public List<Entidades.Spring.CM_CO_Comprobante_Interfase> ToSpringCabecera(List<Entidades.DBS_Header_Factura> lista)
        {
            List<Entidades.Spring.CM_CO_Comprobante_Interfase> result = new List<Entidades.Spring.CM_CO_Comprobante_Interfase>();

            foreach (Entidades.DBS_Header_Factura l in lista)
            {
                Entidades.Spring.CM_CO_Comprobante_Interfase cab =
                    new Entidades.Spring.CM_CO_Comprobante_Interfase()
                    {
                        TipoComprobante = getTipoComprobante(l.Suntip),
                        SerieComprobante = l.Sunpre.Value.ToString(),
                        NumeroComprobante = l.Sunnum.Value.ToString(),
                        IdClienteFacturacion = int.Parse(l.Codcli.Trim()),
                        DocumentoCliente = l.Numruc.Trim(),
                        NombreCliente = l.Rsocia.Trim(),
                        DireccionCliente = l.Direcc.Trim(),
                        FechaEmision = convertTextToDateTime(l.Fecemi.Trim()),
                        Moneda = convertMoneda(l.Moneda),
                        TipoCambio = l.Tipcam.Value,
                        MontoAfecto = l.Suntip.Trim() == "NC" ? l.Vavta1.Value : l.Valaf16.Value,
                        MontoNoAfecto = new decimal(0),
                        MontoImpuestoVentas = l.Impor16.Value,
                        CentroCosto = l.Cencos.Trim(),
                        DocumentoRelacionado = !string.IsNullOrWhiteSpace(l.Refnot) ? getDocumentoRelacionado(l.Refnot) : string.Empty,
                        EstadoDocumento = 3,
                        ClasificadorMovimiento = "999",
                        UnidadOrganizacional = "999",
                        ConceptoGasto = "999",
                        UsuarioCreacion = l.Usuinc.Trim(),
                        CodigoInterno = l.Numori.Trim(),
                        FechaCarga = DateTime.Now,
                        UsuarioResponsableCarga = "MISESF"
                    };

                result.Add(cab);
            }

            return result;
        }

        public string getCentroCosto(string seriedocumento, string docReferencia)
        {
            string result;

            if (docReferencia.StartsWith("AL") || docReferencia.StartsWith("ALD"))
            {
                result = "UH";
            }
            else if (docReferencia.StartsWith("RP") || docReferencia.StartsWith("RPD"))
            {
                result = "UC";
            }
            else if (docReferencia.StartsWith("VT") || docReferencia.StartsWith("VTD"))
            {
                result = "UH";
            }
            else if (docReferencia.StartsWith("OT"))
            {
                result = "UD";
            }
            else if (docReferencia.StartsWith("FAMA"))
            {
                if (seriedocumento.Equals("0010") || seriedocumento.Equals("0011"))
                {
                    result = "UH";
                }
                else
                {
                    result = "UD";
                }
            }
            else
            {
                result = string.Empty;
            }

            return result;
        }

        public string getTipoComprobante(string tipoDocumento)
        {
            string result = string.Empty;

            switch (tipoDocumento.Trim())
            {
                case "FA":
                case "fa":
                    result = "FA";
                    break;
                case "BO":
                case "bo":
                    result = "BV";
                    break;
                case "NA":
                case "na":
                    result = "NC";
                    break;
                case "NC":
                case "nc":
                    result = "ND";
                    break;
            }

            return result;
        }

        public string getDocumentoRelacionado(string documento)
        {
            string result = string.Empty;

            if (documento.Length == 12)
            {
                result = string.Format("{0}-{1}-{2}", getTipoComprobante(documento.Substring(3, 2)), documento.Substring(0, 3), documento.Substring(5, 7));                
            }

            return result;
        }

        public DateTime convertTextToDateTime(string value)
        {
            //Formato: yyyyMMdd
            return DateTime.ParseExact(value, "yyyyMMdd", CultureInfo.InvariantCulture);
            //return new DateTime(int.Parse(value.Substring(0, 4)), int.Parse(value.Substring(4, 2)), int.Parse(value.Substring(6, 2)));
        }

        public string convertMoneda(string value)
        {
            string result = string.Empty;

            switch (value.Trim())
            {
                case "D":
                case "d":
                    result = "EX";
                    break;
                case "N":
                case "n":
                    result = "LO";
                    break;
            }

            return result;
        }

        public void exportarArchivo(string rutaArchivo, List<Entidades.Spring.FacturaSpring_Cabecera2> listaOutput, string tipoArchivo)
        {
            StreamWriter file = new StreamWriter(rutaArchivo, false);
            string line = string.Empty;

            foreach (Entidades.Spring.FacturaSpring_Cabecera2 fc in listaOutput)
            {
                switch (tipoArchivo)
                {
                    case "TXT":
                        line = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t" +
                            "{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}\t{19}\t{20}\t" +
                            "{21}\t{22}\t{23}\t{24}\t{25}\t{26}\t{27}\t{28}\t{29}",
                            fc.TipoComprobante, fc.SerieComprobante, fc.NumeroComprobante,
                            fc.IdClienteFacturacion, fc.DocumentoCliente, fc.NombreCliente,
                            fc.DireccionCliente, fc.FechaEmision.ToShortDateString(), fc.FechaVencimiento.HasValue? fc.FechaVencimiento.Value.ToShortDateString() : string.Empty,
                            fc.Moneda, fc.TipoCambio.ToString(), fc.MontoAfecto.ToString(),
                            fc.MontoNoAfecto.ToString(), fc.MontoImpuestoVentas.ToString(),
                            fc.CentroCosto, fc.IdDocumentoRelacionado,
                            fc.TipoDocumentoRelacionado, fc.SerieDocumentoRelacionado,
                            fc.DocumentoRelacionado, fc.TipoVenta, fc.EstadoDocumento,
                            fc.ClasificadorMovimiento, fc.UnidadOrganizacional, fc.TipoFacturacion,
                            fc.ConceptoGasto, fc.Sucursal, fc.UsuarioCreacion,
                            fc.IdVendedor, fc.CodigoInterno, fc.CiDescripcion);
                        break;
                }

                file.WriteLine(line);
            }

            file.Close();
        }

        public DataTable consulta()
        {
            using (Util.ContextoDBAS400 ctx = Util.ContextoDBAS400.GetContexto())
            {
                iDB2Command cmd =
                    new iDB2Command(
                        "SELECT * FROM LIBR09.EMPSTRC0", ctx.GetConexion(), ctx.GetTx());

                DataTable dtResult = new DataTable();
                dtResult.Load(cmd.ExecuteReader());

                return dtResult;
            }
        }
    }
}
